查看原文
其他

谈谈uCOS和freeRTOS这两种实时系统的结构以及编程思想

嵌入式ARM 嵌入式ARM 2021-01-31
距离上次总结,已经过去有差不多半年了,最近又到了自己半年一次的总结了。首先说说自己的编程风格的变化,在上一篇(第三篇文)中提到的数据结构、配置文件结构、预编译结构,目前已经逐渐适应,也在逐步加深应用。可以说是这半年的一点小变化吧。
 在这中间呢,又跑去折腾了uCOSII和freeRTOS,uCGUI,C#,Linux,ARM9等乱七八糟的东西;现在呢,还是安心的继续搞搞STM32和C语言吧,在飞之前,还是要经历走和跑的过程的。
今天在这里说说我对uCOS和freeRTOS的一点小理解吧。只是针对这两种实时系统的结构和编程思想,不牵扯准确的应用。主要是对新手学习之前有一个结构上的理解。然后呢,本人在嵌入式实时操作系统方面也是一个很老的菜鸟而已,有什么遗漏和不对的地方还希望大家能多多包涵。

正文时间到,学习了那么久实时操作系统,对于操作系统的结构认识也是很模糊的;而去阅读源码吧!是一个很痛苦且工作量很大的事情,本人也是折腾N久,终于有一次(也就是在折腾ARM9时的意外收获)发现一片优秀文章,完后才把实时操作系统基本的结构组织了起来。想想对新手是有很大的帮助,也就来写出来。在这里再次强调一句老掉牙的话:要会一点汇编、了解单片机运行原理和对C有较好的理解。

      

其次呢!单片机它只有一个CPU(排除那个什么双核的单片机,其实我也不太明白它),也就是说它一个时刻点只能做一个事情,就像让你同时照顾10个婴儿一样,你也只能是先哄哄这个,再去哄哄那个。单片机的多任务也是一样的原理。

首先说说一般的、最简单的单片机程序:
  void main(void)
  {
        XXX_Init()
        while(1)
       {
              xxx();
              xxx();
             ......
       }
  }


好了,我刚开始学51的时候,也是这么写的,其实大家都是这么写的。当然这个还没有包括中断。如果加上中断呢?其实能琢磨RTOS的我想基本都会用中断了吧!但是能理解本质的不一定是全部。我还是画结构吧。


void main(void)
  {
        XXX_Init()
        interrupt_init();
        while(1)
       {
              xxx();              ----------------------->假设中断发生在这里,那么单片机就要掉头了,去执行中断了-------->
              我胡汉三又回来了<-------------做好回来的准备<--------------------我从中断忙完了<---------|
              xxx();
             ......
       }
  }

 

好了,大概就这么个样;其实当时我在想,估计多任务操作系统就是根据硬件中断原理写的吧!

    记住硬件中断的准确步骤,有用的。我尽可能的写的通俗一点。
    单片机在运行的时候,用到的几个核心的寄存器(写过汇编的人明白)就是PC、累加器和几个CPU的Rx寄存器、在C语言中还有SP(架构不同,细节不同,基本一样)。在正常运行时,用到了这几个寄存器,我叫它们公用寄存器;那么中断发生时,是要进中断函数的,在中断函数里面也是要进行各种运算的,也会用到那几个公用寄存器,怎么办呢?这个时候,用到了C语言里面的那个栈,把那些东西先暂时保存到栈里面(入栈)(结构不一样,栈的理解也不一样,不细说);在中断服务函数里面,就可以把那些公用寄存器值覆盖掉,而去填入新的值。在中断函数执行完毕后,再把那些数填回到那些公用寄存器(出栈),这样就可以实现while(1)主线程和中断辅助线程的双任务了,多个中断也可以排列成优先级不一样的多任务。
     而实时操作系统呢,就是类似于用软件来产生单片机硬件那样的中断,而且那中断是可控制的。单片机的运行,实际就是PC指引着CPU去哪儿执行命令,CPU用RX和累加器来就运算中间缓冲。操作系统实际就是用软件控制了PC的值,而不是那种单纯的靠着PC指针自加去顺序的执行命令。
     

说到这儿,通俗的原理性的东西好像写完了,剩下的就是软件上面的猛料了。现在回想起来,觉得那些结构和思路写的太完美了。明天再给大家分享,软件上实现任务转移的步骤及分析。

点击下方“阅读原文”查看更多

↓↓↓ 

长按关注嵌入式ARM长按关注21ic官方微信长按关注电源FAN

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存